﻿using GDM.Hogar.Entidades;
using GDM.Hogar.Repositorios.Contratos;
using GDM.Hogar.Repositorios.Core;
using GDM.Hogar.Repositorios.Soporte;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace GDM.Hogar.Repositorios
{
    public class ParteDiarioComedorRepositorio : Repositorio, IParteDiarioComedorRepositorio
    {
        public ParteDiarioComedorRepositorio(IDbManager dbManager)
            : base(dbManager)
        {
        }

        protected override string ProcActualizar
        {
            get
            {
                return ProcedimientosAlmacenados.ParteDiarioComedor.Actualizar;
            }
        }

        public void ActualizarParteDiarioComedor(string parteDiarioComedor)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@ParteDiarioComedorAsXml", DbType.Xml, ParameterDirection.Input, parteDiarioComedor));
            Actualizar(parametros);
        }

        public void GuardarParteDiarioComedor(string parteDiarioComedor)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@ParteDiarioComedorAsXml", DbType.Xml, ParameterDirection.Input, parteDiarioComedor));
            EjecutarConsulta(ProcedimientosAlmacenados.ParteDiarioComedor.Insertar, parametros);
        }

        public ParteDiarioComedor ObtenerParteDiarioComedor(DateTime fecha)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@Fecha", DbType.Date, ParameterDirection.Input, fecha));
            return Obtener<ParteDiarioComedor>(ProcedimientosAlmacenados.ParteDiarioComedor.ObtenerPorFecha, parametros).FirstOrDefault();
        }

        public IList<ConsultaParteDiarioComedor> ObtenerPartesDiarioComedor(int mes, int año)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@Mes", DbType.Int64, ParameterDirection.Input, mes));
            parametros.Add(CrearParametro("@Año", DbType.Int64, ParameterDirection.Input, año));
            var resultado = Obtener<ConsultaParteDiarioComedor, ResponsablesParteDiarioComedor>(ProcedimientosAlmacenados.ParteDiarioComedor.ObtenerPorMesAño, parametros);
            if (resultado.Second.Any())
            {
                foreach (var parteDiarioComedor in resultado.First)
                {
                    ConsultaParteDiarioComedor comedor = parteDiarioComedor;
                    var responsables = resultado.Second.Where(x => x.ParteDiarioComedorId == comedor.ParteDiarioComedorId).ToList();
                    var personalEnCocina = responsables.Aggregate(new StringBuilder(),
                                                                      (sb, x) => sb.Append(x.PersonalCocina + ", "));
                    parteDiarioComedor.PersonalDeCocina = personalEnCocina.ToString();
                    parteDiarioComedor.PersonalDeCocinaIds = responsables.Select(x => x.PersonalCocinaId);
                }
            }
            return resultado.First;
        }

        public void ActivarParteDiarioComedor(int parteDiarioComedorId, bool activo)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@ParteDiarioComedorId", DbType.Int64, ParameterDirection.Input, parteDiarioComedorId));
            parametros.Add(CrearParametro("@Activo", DbType.Boolean, ParameterDirection.Input, activo));
            EjecutarConsulta(ProcedimientosAlmacenados.ParteDiarioComedor.Activar, parametros);
        }
    }

    internal class ResponsablesParteDiarioComedor
    {
        public int PersonalCocinaId { get; set; }

        public int ParteDiarioComedorId { get; set; }

        public string PersonalCocina { get; set; }
    }
}